home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-09-12 | 18.7 KB | 601 lines | [TEXT/MPS ] |
- //========================================================================================
- //
- // File: Commands.cpp
- // Release Version: $ ODF 2 $
- //
- // Copyright: (c) 1993 - 1996 by Apple Computer, Inc., all rights reserved.
- //
- //========================================================================================
-
- #include "IntlTest.hpp"
-
- #ifndef COMMANDS_H
- #include "Commands.h"
- #endif
-
- #ifndef PART_H
- #include "Part.h"
- #endif
-
- #ifndef FRAME_H
- #include "Frame.h"
- #endif
-
- #ifndef CONTENT_H
- #include "Content.h"
- #endif
-
- #ifndef EDITVIEWS_H
- #include "EditViews.h"
- #endif
-
- #ifndef SELECT_H
- #include "Select.h"
- #endif
-
- // ----- Framework Includes -----
-
- #ifndef FWPRESEN_H
- #include "FWPresen.h"
- #endif
-
- // ----- OpenDoc Includes -----
-
- #ifndef SOM_Module_OpenDoc_Commands_defined
- #include <CmdDefs.xh>
- #endif
-
- //========================================================================================
- // RunTime Info
- //========================================================================================
-
- #ifdef FW_BUILD_MAC
- #pragma segment odfIntlTest
- #endif
-
- //========================================================================================
- // CIntlTestDropCommand
- //========================================================================================
-
- FW_DEFINE_AUTO(CIntlTestDropCommand)
-
- //----------------------------------------------------------------------------------------
- // CIntlTestDropCommand constructor
- //----------------------------------------------------------------------------------------
-
- CIntlTestDropCommand::CIntlTestDropCommand(Environment* ev,
- FW_CFrame* frame,
- FW_CEditView* dropView,
- CIntlTestSelection* selection,
- ODDragItemIterator* dropInfo,
- ODFacet* odFacet,
- const FW_CPoint& dropPoint) :
- FW_CDropCommand(ev, frame, dropInfo, odFacet, dropPoint, FW_kCanUndo),
- fDropEditView(dropView),
- fTextSelection(selection),
- fSavedOffset(0)
- {
- // Ensure that dropped text is Internalized into the drop view
- selection->SetContentEditView(dropView);
-
- SetMenuStringsFromResource(ev, kIntlTestUndoStrings, kUndoDropTextMsg, kRedoDropTextMsg);
- FW_END_CONSTRUCTOR
- }
-
- //----------------------------------------------------------------------------------------
- // CIntlTestDropCommand destructor
- //----------------------------------------------------------------------------------------
-
- CIntlTestDropCommand::~CIntlTestDropCommand()
- {
- FW_START_DESTRUCTOR
- }
-
- //----------------------------------------------------------------------------------------
- // CIntlTestDropCommand::SaveUndoState
- //----------------------------------------------------------------------------------------
-
- void CIntlTestDropCommand::SaveUndoState(Environment* ev)
- {
- short endOffset;
- fSavedText = fDropEditView->GetSelectedText(ev);
- fDropEditView->GetSelectionRange(ev, fSavedOffset, endOffset);
- }
-
- //----------------------------------------------------------------------------------------
- // CIntlTestDropCommand::SaveRedoState
- //----------------------------------------------------------------------------------------
- void CIntlTestDropCommand::SaveRedoState(Environment*)
- {
- fDroppedText = fTextSelection->GetSelectedTestContent()->GetInternalizedText();
- }
-
- //----------------------------------------------------------------------------------------
- // CIntlTestDropCommand::UndoIt
- //----------------------------------------------------------------------------------------
-
- void CIntlTestDropCommand::UndoIt(Environment* ev)
- {
- this->SwapText(ev, fDroppedText.GetByteLength(), fSavedText);
- }
-
- //----------------------------------------------------------------------------------------
- // CIntlTestDropCommand::RedoIt
- //----------------------------------------------------------------------------------------
-
- void CIntlTestDropCommand::RedoIt(Environment* ev)
- {
- this->SwapText(ev, fSavedText.GetByteLength(), fDroppedText);
- }
-
- //----------------------------------------------------------------------------------------
- // CIntlTestDropCommand::SwapText
- //----------------------------------------------------------------------------------------
-
- void CIntlTestDropCommand::SwapText(Environment* ev, FW_ByteCount bytesToRemove,
- const FW_CString& textToRestore)
- {
- // Remove designated text
- fDropEditView->SelectText(ev, fSavedOffset, fSavedOffset+(short)bytesToRemove);
- fDropEditView->DoTECommand(ev, kODCommandClear, true);
-
- // Restore the text
- fDropEditView->InsertText(ev, textToRestore, fSavedOffset);
- }
-
- //========================================================================================
- // class CIntlTestEditCommand
- //========================================================================================
-
- FW_DEFINE_AUTO(CIntlTestEditCommand)
-
- //----------------------------------------------------------------------------------------
- // CIntlTestEditCommand constructor
- //----------------------------------------------------------------------------------------
- CIntlTestEditCommand::CIntlTestEditCommand(Environment* ev,
- ODCommandID commandID,
- FW_CFrame* frame,
- CIntlTestSelection* selection,
- FW_CEditView* editView,
- FW_Boolean canUndo)
- : FW_CClipboardCommand(ev, commandID, frame, canUndo),
- fTextSelection(selection),
- fEditView(editView),
- fStartOffset(0),
- fEndOffset(0)
- {
- if (editView)
- fTextSelection->SetContentEditView(editView);
- FW_END_CONSTRUCTOR
- }
-
- //----------------------------------------------------------------------------------------
- // CIntlTestEditCommand destructor
- //----------------------------------------------------------------------------------------
- CIntlTestEditCommand::~CIntlTestEditCommand()
- {
- FW_START_DESTRUCTOR
- }
-
- //----------------------------------------------------------------------------------------
- // CIntlTestEditCommand::PreCommand
- //----------------------------------------------------------------------------------------
- void CIntlTestEditCommand::PreCommand(Environment* ev)
- {
- ODCommandID id = GetCommandID(ev);
- if ((id == kODCommandCopy) || (id == kODCommandCut))
- fEditView->DoTECommand(ev, kODCommandCopy, true); // Tell TE to copy the text
- }
-
- //----------------------------------------------------------------------------------------
- // CIntlTestEditCommand::SaveUndoState
- //----------------------------------------------------------------------------------------
- void CIntlTestEditCommand::SaveUndoState(Environment* ev)
- {
- switch (GetCommandID(ev))
- {
- case kODCommandCut:
- case kODCommandClear:
- fPastedText = fEditView->GetSelectedText(ev);
- fEditView->GetSelectionRange(ev, fStartOffset, fEndOffset);
- break;
-
- case kODCommandPaste:
- fSavedText = fEditView->GetSelectedText(ev);
- fEditView->GetSelectionRange(ev, fStartOffset, fEndOffset);
- break;
- }
- }
-
- //----------------------------------------------------------------------------------------
- // CIntlTestEditCommand::SaveRedoState
- //----------------------------------------------------------------------------------------
- void CIntlTestEditCommand::SaveRedoState(Environment* ev)
- {
- if (GetCommandID(ev) == kODCommandPaste)
- {
- fPastedText = fTextSelection->GetSelectedTestContent()->GetInternalizedText();
- }
- }
-
- //----------------------------------------------------------------------------------------
- // CIntlTestEditCommand::UndoIt
- //----------------------------------------------------------------------------------------
- void CIntlTestEditCommand::UndoIt(Environment* ev)
- {
- FW_CClipboardCommand::UndoIt(ev); // call inherited
-
- switch (GetCommandID(ev))
- {
- case kODCommandCut:
- case kODCommandClear:
- this->RestoreText(ev);
- break;
-
- case kODCommandPaste:
- this->RemoveAndRestoreText(ev, fPastedText.GetByteLength(), fSavedText);
- break;
- }
- }
-
- //----------------------------------------------------------------------------------------
- // CIntlTestEditCommand::RedoIt
- //----------------------------------------------------------------------------------------
- void CIntlTestEditCommand::RedoIt(Environment* ev)
- {
- FW_CClipboardCommand::RedoIt(ev); // call inherited
-
- switch (GetCommandID(ev))
- {
- case kODCommandCut:
- case kODCommandClear:
- this->RemoveText(ev);
- break;
-
- case kODCommandPaste:
- this->RemoveAndRestoreText(ev, fSavedText.GetByteLength(), fPastedText);
- break;
- }
- }
-
- //----------------------------------------------------------------------------------------
- // CIntlTestEditCommand::RemoveText
- //----------------------------------------------------------------------------------------
- void CIntlTestEditCommand::RemoveText(Environment* ev)
- {
- fEditView->SelectText(ev, fStartOffset, fEndOffset);
- fEditView->DoTECommand(ev, kODCommandClear, true);
- }
-
- //----------------------------------------------------------------------------------------
- // CIntlTestEditCommand::RestoreText
- //----------------------------------------------------------------------------------------
- void CIntlTestEditCommand::RestoreText(Environment* ev)
- {
- // Insert the saved text back into the EditView
- fEditView->InsertText(ev, fPastedText, fStartOffset);
- }
-
- //----------------------------------------------------------------------------------------
- // CIntlTestEditCommand::RemoveAndRestoreText
- //----------------------------------------------------------------------------------------
- void CIntlTestEditCommand::RemoveAndRestoreText(Environment* ev, FW_ByteCount bytesToRemove,
- const FW_CString& textToRestore)
- {
- // Remove designated text
- fEditView->SelectText(ev, fStartOffset, fStartOffset+(short)bytesToRemove);
- fEditView->DoTECommand(ev, kODCommandClear, true);
-
- // Restore the text
- fEditView->InsertText(ev, textToRestore, fStartOffset);
- }
-
- //========================================================================================
- // CTypingCommand
- //========================================================================================
-
- FW_DEFINE_AUTO(CTypingCommand)
-
- //-----------------------------------------------------------------------------------------
- CTypingCommand::CTypingCommand(Environment* ev,
- ODCommandID commandID,
- FW_CFrame* frame,
- FW_CEditView* editView,
- FW_Boolean canUndo,
- char firstChar)
- : FW_CCommand(ev, commandID, frame, canUndo),
- fEditView(editView),
- fCompleted(false),
- fFirstChar(firstChar),
- fTypedText(""),
- fSavedText(""),
- fStartOffset(0),
- fEndOffset(0)
- {
- SetMenuStrings(ev, "Undo Typing", "Redo Typing");
- FW_END_CONSTRUCTOR
- }
-
- //-----------------------------------------------------------------------------------------
- CTypingCommand::~CTypingCommand()
- {
- FW_START_DESTRUCTOR
-
- // notify edit view that we're going away
- ((CMyEditView*)fEditView)->TypingCommandAboutToBeDestroyed(this);
- }
-
- //-----------------------------------------------------------------------------------------
- void CTypingCommand::AddCharacter(Environment* ev, char ch)
- {
- if (ch == chBackspace)
- Backspace(ev, ch);
- else
- fTypedText.Append(ch);
- }
-
- //-----------------------------------------------------------------------------------------
- void CTypingCommand::Backspace(Environment* ev, char /*bsChar*/)
- {
- short startOffset, endOffset;
- fEditView->GetSelectionRange(ev, startOffset, endOffset);
-
- if ((startOffset == 0) && (endOffset == 0)) return; // nothing to backspace over
-
- //--- Are we deleting a selection?
- if (endOffset != startOffset) // some text is selected
- {
- fTypedText = ""; // replace selection w/empty string
- }
- else if (startOffset <= fStartOffset) // Backspacing past the start of typing
- {
- // save the character we're about to backspace over
- FW_PlatformHandle teh = fEditView->GetPlatformEditHandle(ev);
- TERec* tep = (TERec*) *teh;
- char* p = (char*) (*(tep->hText)) + startOffset - 1;
- fSavedText.Insert(p, 1, 0);
- fStartOffset--;
- }
- else // backspace over typed text
- {
- FW_ByteCount count = fTypedText.GetByteLength();
- fTypedText.Truncate(count-1); // cut off the last character of the saved text
- }
- }
-
- //-----------------------------------------------------------------------------------------
- void CTypingCommand::CompleteTyping(Environment* ev)
- {
- if (fCompleted) return;
-
- if (!fTypedText.IsEmpty())
- {
- if (GetCanUndo(ev))
- this->SaveRedoState(ev); // save new state, for later Redo
-
- fCompleted = true;
- }
- }
-
- //-----------------------------------------------------------------------------------------
- void CTypingCommand::DoIt(Environment* ev)
- {
- if (GetCanUndo(ev))
- this->SaveUndoState(ev); // save current state, for later Undo
-
- AddCharacter(ev, fFirstChar);
- }
-
- //-----------------------------------------------------------------------------------------
- void CTypingCommand::SaveUndoState(Environment* ev)
- {
- // Get current selection info, for Undo
- fSavedText = fEditView->GetSelectedText(ev);
- fEditView->GetSelectionRange(ev, fStartOffset, fEndOffset);
- }
-
- //-----------------------------------------------------------------------------------------
- void CTypingCommand::SaveRedoState(Environment*)
- {
- // fTypedText contains the new text - what else do we need?
- }
-
- //-----------------------------------------------------------------------------------------
- void CTypingCommand::UndoIt(Environment* ev)
- {
- this->CompleteTyping(ev);
-
- fEditView->SelectText(ev, fStartOffset, fStartOffset+fTypedText.GetByteLength());
- fEditView->SetSelectedText(ev, fSavedText);
- }
-
- //-----------------------------------------------------------------------------------------
- void CTypingCommand::RedoIt(Environment* ev)
- {
- fEditView->SelectText(ev, fStartOffset, fStartOffset+fSavedText.GetByteLength());
- fEditView->SetSelectedText(ev, fTypedText);
- }
-
- //========================================================================================
- // class CTSMTypingCommand
- //========================================================================================
-
- FW_DEFINE_AUTO(CTSMTypingCommand)
-
- //-----------------------------------------------------------------------------------------
- CTSMTypingCommand::CTSMTypingCommand(Environment* ev,
- ODCommandID commandID,
- FW_CFrame* frame,
- FW_CEditView* editView,
- CTSMInput* firstInput)
- : CTypingCommand(ev, commandID, frame, editView, FW_kCanUndo, 0),
- fFirstInput(firstInput)
- {
- FW_END_CONSTRUCTOR
- }
-
- //-----------------------------------------------------------------------------------------
- CTSMTypingCommand::~CTSMTypingCommand()
- {
- FW_START_DESTRUCTOR
- }
-
- //-----------------------------------------------------------------------------------------
- void CTSMTypingCommand::AddInput(Environment* ev, CTSMInput* input)
- {
- if (input->IsMultiByte())
- fTypedText.Append(input->fChars, input->fByteCount);
- else if (input->fByte == chBackspace)
- Backspace(ev);
- else
- fTypedText.Append(input->fByte);
- }
-
- //-----------------------------------------------------------------------------------------
- void CTSMTypingCommand::Backspace(Environment* ev)
- {
- short bytesPerChar = 2;
- short startOffset, endOffset;
- fEditView->GetSelectionRange(ev, startOffset, endOffset);
-
- if ((startOffset == 0) && (endOffset == 0)) return; // nothing to backspace over
-
- //--- Are we deleting a selection?
- if (endOffset != startOffset) // some text is selected
- {
- fTypedText = ""; // replace selection w/empty string
- }
- else if (startOffset <= fStartOffset) // Backspacing past the start of typing
- {
- // save the character we're about to backspace over
- FW_PlatformHandle teh = fEditView->GetPlatformEditHandle(ev);
- TERec* tep = (TERec*) *teh;
- char* p = (char*) (*(tep->hText)) + startOffset;
- // Check if the previous character is a single-byte CR
- --p;
- if (*p == chReturn)
- bytesPerChar = 1;
- else
- --p;
- fSavedText.Insert(p, bytesPerChar, 0);
- fStartOffset -= bytesPerChar;
- }
- else // backspace over typed text
- {
- FW_ByteCount count = fTypedText.GetByteLength();
- FW_ASSERT(count > 0);
- // Check if the last typed character is a single-byte CR
- if (fTypedText[count-1] == chReturn) // FW_CString oper[] is 0-based
- bytesPerChar = 1;
- else if (count == 1) // kludge
- bytesPerChar = 1;
- fTypedText.Truncate(count-bytesPerChar); // cut off the last character of the saved text
- }
- }
-
- //-----------------------------------------------------------------------------------------
- void CTSMTypingCommand::DoIt(Environment* ev)
- {
- if (GetCanUndo(ev))
- this->SaveUndoState(ev); // save current state, for later Undo
-
- if (fFirstInput)
- {
- AddInput(ev, fFirstInput);
- fFirstInput = NULL; // only valid for this one time
- }
- }
-
-
- //========================================================================================
- // CFontCommand
- //========================================================================================
-
- FW_DEFINE_AUTO(CFontCommand)
-
- //----------------------------------------------------------------------------------------
- CFontCommand::CFontCommand(Environment* ev,
- ODCommandID id,
- FW_CFrame* frame,
- CMyEditView* editView)
- : FW_CCommand(ev, id, frame, FW_kCanUndo),
- fEditView(editView)
- {
- fNameChange = (cFirstFontCommand <= id && id < cFirstFontCommand+gFontCount);
- if (fNameChange)
- SetMenuStringsFromResource(ev, kIntlTestUndoStrings, kUndoFontChangeMsg, kRedoFontChangeMsg);
- else // size change
- SetMenuStringsFromResource(ev, kIntlTestUndoStrings, kUndoFontSizeMsg, kRedoFontSizeMsg);
- FW_END_CONSTRUCTOR
- }
-
- //----------------------------------------------------------------------------------------
- CFontCommand::~CFontCommand()
- {
- FW_START_DESTRUCTOR
- }
-
- //----------------------------------------------------------------------------------------
- void CFontCommand::DoIt(Environment* ev)
- {
- // Save Undo state (current font)
- fOldFont = fEditView->GetCurrentFont();
- fOldFontCommand = fEditView->GetCurrentFontCmd(ev);
-
- // Change font
- ODCommandID id = GetCommandID(ev);
- if (fNameChange)
- {
- FW_CString fontName;
- fEditView->CommandToString(ev, id, fontName);
- fEditView->DoSetFont(ev, id, fontName);
- }
- else // size change
- {
- FW_CString sizeString;
- fEditView->CommandToString(ev, id, sizeString);
- int fontSize = sizeString.ParseAsUnsignedInteger();
- fEditView->DoSetFontSize(ev, fontSize);
- }
-
- // Save Redo state (new font)
- fNewFont = fEditView->GetCurrentFont();
- }
-
- //----------------------------------------------------------------------------------------
- void CFontCommand::UndoIt(Environment* ev)
- {
- // Set editView's font to the old one
- ODCommandID id = GetCommandID(ev);
- if (fNameChange)
- {
- FW_CString fontName;
- fOldFont.GetFontName(fontName);
- fEditView->DoSetFont(ev, fOldFontCommand, fontName);
- }
- else // size change
- {
- int fontSize = FW_FixedToInt(fOldFont.GetFontSize());
- fEditView->DoSetFontSize(ev, fontSize);
- }
- }
-
- //----------------------------------------------------------------------------------------
- void CFontCommand::RedoIt(Environment* ev)
- {
- ODCommandID id = GetCommandID(ev);
- if (fNameChange)
- {
- FW_CString fontName;
- fNewFont.GetFontName(fontName);
- fEditView->DoSetFont(ev, id, fontName);
- }
- else // size change
- {
- int fontSize = FW_FixedToInt(fNewFont.GetFontSize());
- fEditView->DoSetFontSize(ev, fontSize);
- }
- }
-
-
-